#!/bin/bash

# 脚本名称：force_unmount_nbd.sh

# 功能说明：
# 本脚本用于强制卸载并断开所有挂载的 NBD 设备。

# 主要流程包括：
# 1. 安装必要的依赖工具（如 lsblk、qemu-nbd、findmnt 等）。
# 2. 查找所有挂载的 NBD 设备。
# 3. 卸载所有挂载的 NBD 设备。
# 4. 断开所有 NBD 设备。

# 注意事项：
# - 需要 root 权限运行部分命令，如 qemu-nbd、umount。
# - 在执行卸载和断开操作前，建议备份重要数据，以防万一。

echo "正在查找并卸载所有 NBD 设备..."

# 安装所需的依赖项
install_dependencies() {
    local required=("lsblk" "qemu-nbd" "findmnt")
    local missing=()

    # 检查每个依赖项是否已安装
    for cmd in "${required[@]}"; do
        if ! command -v "$cmd" >/dev/null 2>&1; then
            missing+=("$cmd")
        fi
    done

    # 如果所有依赖项都已安装，则返回
    if [ ${#missing[@]} -eq 0 ]; then
        return 0
    fi

    # 安装缺少的依赖项
    echo "检测到缺少依赖命令: ${missing[*]}，尝试自动安装..."
    sudo apt-get update -qq
    echo "正在安装 qemu-utils..."
    sudo apt-get install -y -qq qemu-utils >/dev/null
}

# 卸载 NBD 设备的函数
unmount_nbd() {
    local dev=$1
    local mountpoint=$(findmnt -n -o TARGET "/dev/$dev")
    
    if [[ -n $mountpoint ]]; then
        echo "正在卸载 /dev/$dev (挂载点: $mountpoint)"
        if sudo umount -f "/dev/$dev" 2>/dev/null; then
            echo "成功卸载 /dev/$dev"
        else
            echo "卸载 /dev/$dev 失败"
        fi
    fi
}

# 断开 NBD 设备的函数
disconnect_nbd() {
    local dev=$1
    echo "正在断开 /dev/$dev"
    if sudo qemu-nbd -d "/dev/$dev" 2>/dev/null; then
        echo "成功断开 /dev/$dev"
    else
        echo "断开 /dev/$dev 失败"
    fi
}

# 获取所有挂载的 nbd 设备
nbd_devices=$(lsblk -nl | awk '/nbd/ {print $1}')

# 遍历所有 NBD 设备并卸载和断开它们
for dev in $nbd_devices; do
    unmount_nbd "$dev"
    disconnect_nbd "$dev"
done

echo "所有 NBD 设备已卸载并断开。"

